package duplas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

import com.thoughtworks.xstream.XStream;

public class PosicaoSemana implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private Integer _semana;	
	private List<ArrayList<String>> _posicoes;
	private Integer _quemAndou;
	private static Map<Integer, PosicaoSemana> todos;
	
	public Integer getQuemAndou() {
		return _quemAndou;
	}
	
	public void setQuemAndou(Integer quemAndou){
		_quemAndou = quemAndou;
	}
	
	public void inverterQuemAndou(){
		_quemAndou = (_quemAndou == 0 ? 1 : 0);
	}
	
	public PosicaoSemana(Integer semana, Integer quemAndou, List<ArrayList<String>> posicoes) {
		super();
		_semana = semana;
		_posicoes = posicoes;
		_quemAndou = quemAndou;
		getTodos().put(semana, this);
	}

	public Integer getSemana() {
		return _semana;
	}

	public List<ArrayList<String>> getPosicoes() {
		return _posicoes;
	}
	
	public List<ArrayList<String>> getPosicoesCopia(){
		List<ArrayList<String>> copia = new ArrayList<ArrayList<String>>();
		
		for (ArrayList<String> dupla : getPosicoes()){
			ArrayList<String> copiaDupla = new ArrayList<String>();
			copiaDupla.add(dupla.get(0));
			copiaDupla.add(dupla.get(1));
			
			copia.add(copiaDupla);
		}
		return copia;
	}
	
	@Override
	public String toString() {		
		return ("Posicionamento da Semana " + _semana + "\n" + Utils.formataPosicoes(_posicoes));
	}
	
	public Boolean isDuplaAlocadaCorretamente(Dupla dupla){
		
		ArrayList<String> duplaArmazenada = _posicoes.get(dupla.posicao() - 1);
		
		return duplaArmazenada.get(0).equals(dupla.pessoa1()) &&
			duplaArmazenada.get(1).equals(dupla.pessoa2());
	}
	
	public void insereDupla(Dupla dupla) {	
		ArrayList<String> duplaArmazenada = _posicoes.get(dupla.posicao() - 1);
		
		duplaArmazenada.remove(0);
		duplaArmazenada.add(0, dupla.pessoa1());
		
		duplaArmazenada.remove(1);
		duplaArmazenada.add(1, dupla.pessoa2());
	}

	public static void serializa() {
		XStream x = new XStream();
		String xml = x.toXML(getTodos());
		
		FileOutputStream fos2 = null;		
		try {
			fos2 = new FileOutputStream("todosXML.xml");
			fos2.write(xml.getBytes());
			fos2.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public static Map<Integer, PosicaoSemana> deSerializa() {
		try {
			Scanner s = new Scanner(new File("todosXML.xml"));
			s.useDelimiter("\\Z");
			String content = s.next();
			XStream x = new XStream();
			todos = (Map<Integer, PosicaoSemana>) x.fromXML(content);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}		
		if (todos == null)
			todos = new HashMap<Integer, PosicaoSemana>();
			
		
		return todos;
	}
	
	
	public static PosicaoSemana pesquisaDadoSemana(Integer semana) {
		return getTodos().get(semana);
	}
	
	public static void excluirSemana(Integer semana){
		getTodos().remove(semana);
	}
	
	public static Map<Integer, PosicaoSemana> getTodos(){
		if (todos == null) 
			deSerializa();		
		return todos;
	}
	
	public static PosicaoSemana ultimaPosicao(){
		Set<Integer> semanas = getTodos().keySet();
		Integer ultimaSemana = Collections.max(semanas);
		return getTodos().get(ultimaSemana);
	}

	public static void limpar() {
		todos = new HashMap<Integer, PosicaoSemana>();
		serializa();
		
	}

	

}
